#ifndef _AD9833_H_
#define _AD9833_H_
#include "stm32f10x.h"

/*
bilibili 小努班 UID:437280309
@time时间: 2025.7.20
@version版本:V1_1
@Encoding :UTF-8
@attention : 可以输出正弦波，三角波和方波，正弦波和三角的输出都是600mv左右，方波输出可以达到接近VCC。注意自己的AD9833_FCLK时钟频率是否和板子上匹配
如果你的时钟频率变小假如为1M，那么你的控制精度会变为0.004Hz(但是带宽会变小，频率变大会失真)。25M的时候为0.1Hz。

if you can't display Chinese correctly,please check your encoding mode(please set encoding mode to UTF-8)
*/

//成功在STM32F4和G4,F1中测试，使用软件读写，并且已经使用寄存器加速操作,G431的软件SCL翻转速度2M
#define AD9833_FCLK 25000000	//设置晶振频率25000000
typedef enum{//波形类型选择
    AD9833_Type_Sin,        //Sin
    AD9833_Type_triangle,   //三角波
    AD9833_Type_rectangle   //方波
}AD9833_Type;

typedef struct AD9833{
	GPIO_TypeDef  *GPIOSCL;
	GPIO_TypeDef  *GPIOSDA;
	GPIO_TypeDef  *GPIOFSYNC;
	uint16_t SDA;
	uint16_t SCL;
	uint16_t FSYNC;
}AD9833_Typedf;
/*快速初始化模板
  AD9833_Typedf AD9833_1;
  AD9833_Init(&AD9833_1,
		  GPIOC,GPIO_Pin_11,//SCL
		  GPIOC,GPIO_Pin_10,//SDA
		  GPIOC,GPIO_Pin_12,//FSYNC
		  AD9833_Type_Sin);
  AD9833_SetFrequency(&AD9833_1,0,10000);
 */

////////////////////常用函数//////////////////////
void AD9833_Init(AD9833_Typedf* this,
		GPIO_TypeDef  *GPIOSCL,uint16_t SCL,
		GPIO_TypeDef  *GPIOSDA,uint16_t SDA,
		GPIO_TypeDef  *GPIOFSYNC,uint16_t FSYNC,
		AD9833_Type type);//初始化AD9833(记得打开时钟)
void AD9833_SetFrequency(AD9833_Typedf* this,uint8_t reg, float freq);//设置频率
void AD9833_SetPhase(AD9833_Typedf* this,uint8_t Phasereg, uint16_t val);//设置相位
void AD9833_SetWave(AD9833_Typedf* this,AD9833_Type type);//输出类型

////////////////////扩展函数/////////////////////
void AD9833_SweepWave_block(AD9833_Typedf* this,float Min_freq, float Max_freq,float step,uint16_t time);//阻塞扫频
void AD9833_SweepWave(AD9833_Typedf* this,float Min_freq, float Max_freq,float step,uint16_t time);//非阻塞扫频
void AD9833_Sleep(AD9833_Typedf* this);
void AD9833_ReSet(AD9833_Typedf* this);

#endif // _AD9833_H
